home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / term43-source.lha / Extras / Source / gtlayout-Source.lha / LTP_DetermineSize.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-29  |  17.3 KB  |  631 lines

  1. /*  GadTools layout toolkit
  2. **
  3. **  Copyright © 1993-1994 by Olaf `Olsen' Barthel
  4. **  Freely distributable.
  5. */
  6.  
  7. #include "gtlayout_global.h"
  8.  
  9. VOID __regargs
  10. LTP_DetermineSize(LayoutHandle *Handle,ObjectNode *Node)
  11. {
  12.     if(!Handle -> Failed)
  13.     {
  14.         LONG i,Len,Width,Max;
  15.  
  16.         if(Node -> Label)
  17.         {
  18.             UWORD LabelWidth = LT_LabelWidth(Handle,Node -> Label);
  19.  
  20.             if(Node -> LabelChars * Handle -> GlyphWidth > LabelWidth)
  21.                 LabelWidth = Node -> LabelChars * Handle -> GlyphWidth;
  22.  
  23.             Node -> LabelWidth = LabelWidth;
  24.         }
  25.         else
  26.             Node -> LabelWidth = 0;
  27.  
  28.         switch(Node -> Type)
  29.         {
  30. #ifdef DO_LEVEL_KIND
  31.             case LEVEL_KIND:
  32.  
  33.                 Node -> Width    = 6 + Node -> Chars * Handle -> GlyphWidth + 6;
  34.                 Node -> Height    = 2 + Handle -> RPort . TxHeight + 1;
  35.  
  36.                 if((!Node -> Special . Level . MaxLevelWidth || Handle -> Rescaled))
  37.                 {
  38.                     LT_LevelWidth(Handle,Node -> Special . Level . LevelFormat,Node -> Special . Level . DispFunc,Node -> Special . Level . Min,Node -> Special . Level . Max,&Node -> Special . Level . MaxLevelWidth,NULL,Node -> Special . Level . FullLevelCheck);
  39.  
  40.                     Node -> Special . Level . MaxLevelWidth += TextLength(&Handle -> RPort," ",1);
  41.                 }
  42.  
  43.                 Node -> Special . Level . Handle        = Handle;
  44.                 Node -> Special . Level . CustomHook . h_Entry    = (HOOKFUNC)LTP_LevelGadgetDispatcher;
  45.  
  46.                 if(!Node -> Special . Level . Plus)
  47.                     Node -> Special . Level . Plus = Node -> Special . Level . Min;
  48.  
  49.                 if(Node -> Special . Level . LevelPlace == PLACETEXT_LEFT)
  50.                     Node -> LabelWidth += Node -> Special . Level . MaxLevelWidth;
  51.  
  52.                 break;
  53. #endif    /* DO_LEVEL_KIND */
  54.             case GROUP_KIND:
  55.  
  56.                 LTP_LayoutGroup(Handle,Node);
  57.  
  58.                 break;
  59.  
  60.             case XBAR_KIND:
  61.  
  62.                 Node -> Width    = Handle -> GlyphWidth;
  63.                 Node -> Height    = 6;
  64.  
  65.                 break;
  66.  
  67.             case YBAR_KIND:
  68.  
  69.                 Node -> Width    = 6;
  70.                 Node -> Height    = Handle -> RPort . TxHeight;
  71.  
  72.                 break;
  73.  
  74.             case FRAME_KIND:
  75.  
  76.                 if(Node -> Special . Frame . DrawBox)
  77.                 {
  78.                     Node -> Width    = 4 + Node -> Special . Frame . InnerWidth + 4;
  79.                     Node -> Height    = 2 + Node -> Special . Frame . InnerHeight + 2;
  80.                 }
  81.                 else
  82.                 {
  83.                     Node -> Width    = Node -> Special . Frame . InnerWidth;
  84.                     Node -> Height    = Node -> Special . Frame . InnerHeight;
  85.                 }
  86.  
  87.                 break;
  88.  
  89.             case BOX_KIND:
  90.  
  91.                 Node -> LabelWidth = 0;
  92.  
  93.                 if(Node -> Special . Box . Labels)
  94.                 {
  95.                     for(i = 0 ; i < Node -> Lines ; i++)
  96.                     {
  97.                         if((Width = TextLength(&Handle -> RPort,Node -> Special . Box . Labels[i],strlen(Node -> Special . Box . Labels[i]))) > Node -> LabelWidth)
  98.                             Node -> LabelWidth = Width;
  99.                     }
  100.                 }
  101.  
  102.                 if(Node -> LabelChars * Handle -> GlyphWidth > Node -> LabelWidth)
  103.                     Node -> LabelWidth = Node -> LabelChars * Handle -> GlyphWidth;
  104.  
  105.                 Max = Node -> Chars;
  106.  
  107.                 if(Node -> Special . Box . Lines)
  108.                 {
  109.                     LONG MaxWidth = 0;
  110.  
  111.                     for(i = 0 ; i < Node -> Lines ; i++)
  112.                     {
  113.                         if(Node -> Special . Box . Lines[i])
  114.                         {
  115.                             if(Len = strlen(Node -> Special . Box . Lines[i]))
  116.                             {
  117.                                 if((Width = TextLength(&Handle -> RPort,Node -> Special . Box . Lines[i],Len)) > MaxWidth)
  118.                                     MaxWidth = Width;
  119.                             }
  120.                         }
  121.                     }
  122.  
  123.                     if(Max < (MaxWidth + Handle -> GlyphWidth - 1) / Handle -> GlyphWidth)
  124.                         Max = (MaxWidth + Handle -> GlyphWidth - 1) / Handle -> GlyphWidth;
  125.                 }
  126.  
  127.                 Node -> Height    = 2 + Node -> Lines * Handle -> RPort . TxHeight + 2;
  128.                 Node -> Width    = 4 + Max * Handle -> GlyphWidth + 4;
  129.  
  130.                 break;
  131.  
  132.             case BUTTON_KIND:
  133.  
  134.                 if(Node -> Chars * Handle -> GlyphWidth > Node -> LabelWidth)
  135.                     Node -> Width = Node -> Chars * Handle -> GlyphWidth;
  136.                 else
  137.                     Node -> Width = Node -> LabelWidth;
  138.  
  139.                 Node -> LabelWidth = 0;
  140.                 Node -> LabelPlace = PLACE_IN;
  141.  
  142.                 if(Node -> Special . Button . ExtraFat)
  143.                 {
  144.                     Node -> Width    = 6 + Handle -> GlyphWidth + Node -> Width + Handle -> GlyphWidth + 6;
  145.                     Node -> Height    = 2 + (3 * Handle -> RPort . TxHeight) / 2 + 2;
  146.                 }
  147.                 else
  148.                 {
  149.                     Node -> Width    = 6 + Node -> Width + 6;
  150.                     Node -> Height    = 3 + Handle -> RPort . TxHeight + 3;
  151.                 }
  152.  
  153.                 break;
  154.  
  155.             case CHECKBOX_KIND:
  156.  
  157.                 Node -> Width = Node -> Height = (4 * Handle -> RPort . TxHeight) / 3;
  158.  
  159.                 if(!V39)
  160.                 {
  161.                     if(Node -> Width < CHECKBOX_WIDTH)
  162.                         Node -> Width = CHECKBOX_WIDTH;
  163.  
  164.                     if(Node -> Height < CHECKBOX_HEIGHT)
  165.                         Node -> Height = CHECKBOX_HEIGHT;
  166.                 }
  167.                 else
  168.                 {
  169.                     Node -> Width = (Node -> Width * Handle -> AspectY) / Handle -> AspectX;
  170.  
  171.                     if(Node -> Height < CHECKBOX_HEIGHT)
  172.                     {
  173.                         Node -> Height    = CHECKBOX_HEIGHT;
  174.                         Node -> Width    = (Node -> Height * Handle -> AspectY) / Handle -> AspectX;
  175.                     }
  176.                 }
  177.  
  178.                 break;
  179.  
  180.             case LISTVIEW_KIND:
  181.  
  182.                 i    = 0;
  183.                 Max    = 0;
  184.                 Width    = Node -> Chars * Handle -> GlyphWidth;
  185.  
  186.                 if((ULONG)Node -> Special . List . Labels == 0xFFFFFFFF)
  187.                     Node -> Min = Node -> Max = -1;
  188.                 else
  189.                 {
  190.                     if(Node -> Special . List . Labels)
  191.                     {
  192.                         struct Node *Item;
  193.  
  194.                         SCANLIST(Node -> Special . List . Labels,Item)
  195.                         {
  196.                             i++;
  197.  
  198.                             if((Len = TextLength(&Handle -> RPort,Item -> ln_Name,strlen(Item -> ln_Name))) > Max)
  199.                                 Max = Len;
  200.                         }
  201.                     }
  202.  
  203.                     if(Node -> Special . List . IgnoreListContents)
  204.                         Max = 0;
  205.  
  206.                     Node -> Max = i - 1;
  207.                 }
  208.  
  209.                 if(Max > Width && !Node -> Special . List . SizeLocked)
  210.                 {
  211.                     Width = Max;
  212.  
  213.                     Node -> Chars = (Width + Handle -> GlyphWidth - 1) / Handle -> GlyphWidth;
  214.  
  215.                     Width = Node -> Chars * Handle -> GlyphWidth;
  216.                 }
  217.  
  218.                 if(Node -> Special . List . LockSize)
  219.                     Node -> Special . List . SizeLocked = TRUE;
  220.  
  221.                 if(!V39)
  222.                     Node -> Width = (4 + Width + 4) + (2 + 2 * Handle -> GlyphWidth + 2) + 8;
  223.                 else
  224.                     Node -> Width = (4 + Width + 4) + (2 + 2 * Handle -> GlyphWidth + 2);
  225.  
  226.                 Node -> Height = 2 + Node -> Lines * Handle -> RPort . TxHeight + 2;
  227.  
  228.                 if(Node -> Special . List . ReadOnly)
  229.                 {
  230.                     if(Node -> Special . List . LinkID != -1)
  231.                     {
  232.                         if(!V39)
  233.                             Node -> Height += 2 + Handle -> RPort . TxHeight + 2;
  234.                     }
  235.                 }
  236.                 else
  237.                 {
  238.                     if(Node -> Special . List . LinkID != -1 && Node -> Special . List . LinkID != NIL_LINK)
  239.                         Node -> Height += 3 + Handle -> RPort . TxHeight + 3;
  240.                 }
  241.  
  242.                 if(Node -> Special . List . ExtraLabels)
  243.                 {
  244.                     for(i = Max = 0 ; Node -> Special . List . ExtraLabels[i] ; i++)
  245.                     {
  246.                         if((Len = TextLength(&Handle -> RPort,Node -> Special . List . ExtraLabels[i],strlen(Node -> Special . List . ExtraLabels[i]))) > Max)
  247.                             Max = Len;
  248.                     }
  249.  
  250.                     Node -> Special . List . ExtraLabelWidth = Max;
  251.                 }
  252.  
  253.                 if(Node -> LabelWidth > Node -> Width && (Node -> LabelPlace == PLACE_ABOVE || Node -> LabelPlace == PLACE_BELOW))
  254.                     Node -> Width = Node -> LabelWidth;
  255.  
  256.                 break;
  257.  
  258.             case MX_KIND:
  259.  
  260.                 i    = 0;
  261.                 Max    = 0;
  262.  
  263.                 while(Node -> Special . Radio . Choices[i])
  264.                 {
  265.                     if((Width = TextLength(&Handle -> RPort,Node -> Special . Radio . Choices[i],strlen(Node -> Special . Radio . Choices[i]))) > Max)
  266.                         Max = Width;
  267.  
  268.                     i++;
  269.                 }
  270.  
  271.                 Node -> Max = i - 1;
  272.  
  273.                 Node -> Special . Radio . LabelWidth = Max;
  274.  
  275.                 if(Node -> LabelChars * Handle -> GlyphWidth > Node -> LabelWidth)
  276.                     Node -> LabelWidth = Node -> LabelChars * Handle -> GlyphWidth;
  277.  
  278.                 Node -> Height = MAX(MX_HEIGHT,Handle -> RPort . TxHeight);
  279.  
  280.                 if(!V39)
  281.                     Node -> Width = MX_WIDTH;
  282.                 else
  283.                 {
  284.                     Node -> Width = (Node -> Height * Handle -> AspectY) / Handle -> AspectX;
  285.  
  286.                     if(Node -> Height < MX_HEIGHT)
  287.                     {
  288.                         Node -> Height = MX_HEIGHT;
  289.                         Node -> Width  = (Node -> Height * Handle -> AspectX) / Handle -> AspectY;
  290.                     }
  291.                 }
  292.  
  293.                 Node -> Lines  = i;
  294.                 Node -> Height = Node -> Lines * (Node -> Height + Handle -> InterHeight) - Handle -> InterHeight;
  295.  
  296.                 break;
  297.  
  298.             case TEXT_KIND:
  299.  
  300.                 if(Node -> Special . Text . Text)
  301.                     Max = TextLength(&Handle -> RPort,Node -> Special . Text . Text,strlen(Node -> Special . Text . Text));
  302.                 else
  303.                     Max = 0;
  304.  
  305.                 Width = Node -> Chars * Handle -> GlyphWidth;
  306.  
  307.                 if(Max > Width)
  308.                     Width = Max;
  309.  
  310.                 Node -> Width    = 6 + Width + 6;
  311.                 Node -> Height    = 3 + Handle -> RPort . TxHeight + 3;
  312.  
  313.                 if(Node -> Special . Text . UsePicker)
  314.                     Node -> Width += (4 + (Handle -> GlyphWidth & ~1) + 1 + 4);
  315.  
  316.                 if(Node -> LabelWidth > Node -> Width && (Node -> LabelPlace == PLACE_ABOVE || Node -> LabelPlace == PLACE_BELOW))
  317.                     Node -> Width = Node -> LabelWidth;
  318.  
  319.                 break;
  320.  
  321. #ifdef DO_GAUGE_KIND
  322.             case GAUGE_KIND:
  323.  
  324.                 Width = TextLength(&Handle -> RPort,"0% 100%",7);
  325.  
  326.                 if(Handle -> GlyphWidth * Node -> Chars > Width)
  327.                     Width = Handle -> GlyphWidth * Node -> Chars;
  328.  
  329.                 Node -> Width    = 6 + Width + 6;
  330.                 Node -> Height    = 3 + Handle -> RPort . TxHeight + 2 + Handle -> InterHeight + Handle -> RPort . TxHeight + 3;
  331.  
  332.                 if(Node -> LabelWidth > Node -> Width && (Node -> LabelPlace == PLACE_ABOVE || Node -> LabelPlace == PLACE_BELOW))
  333.                     Node -> Width = Node -> LabelWidth;
  334.  
  335.                 break;
  336. #endif
  337.  
  338. #ifdef DO_TAPEDECK_KIND
  339.             case TAPEDECK_KIND:
  340.             {
  341.                 LONG Width,Height;
  342.  
  343.                 Width = TextLength(&Handle -> RPort,"AA",2);
  344.  
  345.                 if(Width < 2 * Handle -> GlyphWidth);
  346.                     Width = 2 * Handle -> GlyphWidth;
  347.  
  348.                 if(Width < 2 * Handle -> RPort . TxHeight)
  349.                     Width = 2 * Handle -> RPort . TxHeight;
  350.  
  351.                 if(Node -> Special . TapeDeck . Smaller)
  352.                     Width = (3 * Width) / 4;
  353.  
  354.                 if(Width & 1)
  355.                     Width++;
  356.  
  357.                 Width    = 1 + ((((Width + 5) / 6) * 6) & ~1);
  358.                 Height    = (Handle -> AspectX * Width) / (Handle -> AspectY * 2);
  359.  
  360.                 if(!(Height & 1))
  361.                     Height++;
  362.  
  363.                 if(Node -> Special . TapeDeck . ButtonType == TDBT_BACKWARD || Node -> Special . TapeDeck . ButtonType == TDBT_FORWARD)
  364.                     Node -> Special . TapeDeck . ButtonWidth = Width;
  365.                 else
  366.                     Node -> Special . TapeDeck . ButtonWidth = Width / 2;
  367.  
  368.                 Node -> Special . TapeDeck . ButtonHeight = Height;
  369.  
  370.                 if(Handle -> GlyphWidth * Node -> Chars > Width)
  371.                     Width = Handle -> GlyphWidth * Node -> Chars;
  372.  
  373.                 Node -> Width    = 6 + Width + 6;
  374.                 Node -> Height    = 3 + Height + 3;
  375.  
  376.                 if(Node -> LabelWidth > Node -> Width && (Node -> LabelPlace == PLACE_ABOVE || Node -> LabelPlace == PLACE_BELOW))
  377.                     Node -> Width = Node -> LabelWidth;
  378.  
  379.                 break;
  380.             }
  381. #endif    /* DO_TAPEDECK_KIND */
  382.  
  383.             case NUMBER_KIND:
  384.  
  385.                 Node -> Width    = 6 + Node -> Chars * Handle -> GlyphWidth + 6;
  386.                 Node -> Height    = 2 + Handle -> RPort . TxHeight + 2;
  387.  
  388.                 break;
  389.  
  390.             case CYCLE_KIND:
  391.  
  392.                 Width = Node -> Chars * Handle -> GlyphWidth;
  393.  
  394.                 if(Node -> Special . Cycle . Choices)
  395.                 {
  396.                     for(i = 0 ; Node -> Special . Cycle . Choices[i] ; i++)
  397.                     {
  398.                         if((Len = TextLength(&Handle -> RPort,Node -> Special . Cycle . Choices[i],strlen(Node -> Special . Cycle . Choices[i]))) > Width)
  399.                             Width = Len;
  400.                     }
  401.  
  402.                     Node -> Max = i - 1;
  403.                 }
  404.  
  405.                 Node -> Width    = 26 + Width + 6;
  406.                 Node -> Height    = 3 + Handle -> RPort . TxHeight + 3;
  407.  
  408.                 if(Node -> LabelWidth > Node -> Width && (Node -> LabelPlace == PLACE_ABOVE || Node -> LabelPlace == PLACE_BELOW))
  409.                     Node -> Width = Node -> LabelWidth;
  410.  
  411.                 break;
  412.  
  413.             case PALETTE_KIND:
  414.  
  415.                 if(Node -> Special . Palette . NumColours)
  416.                     Node -> Max = Node -> Min + Node -> Special . Palette . NumColours - 1;
  417.                 else
  418.                 {
  419.                     if(!Node -> Special . Palette . Depth)
  420.                         Node -> Special . Palette . Depth = 1;
  421.  
  422.                     Node -> Special . Palette . NumColours = 1L << Node -> Special . Palette . Depth;
  423.  
  424.                     Node -> Max = Node -> Min + Node -> Special . Palette . NumColours - 1;
  425.                 }
  426.  
  427.                 if(Node -> Special . Palette . SmallPalette)
  428.                 {
  429.                     Node -> Width    = Handle -> GlyphWidth * (Node -> Max - Node -> Min + 1) + 4;
  430.                     Node -> Height    = 1 + Handle -> RPort . TxHeight + 1;
  431.  
  432.                     if((Node -> Width - 4) / (Node -> Max - Node -> Min + 1) < 8 && Node -> Height < 2 * 8)
  433.                         Node -> Width = 8 * (Node -> Max - Node -> Min + 1) + 4;
  434.  
  435.                     Node -> Width += 2 * Handle -> GlyphWidth;
  436.                 }
  437.                 else
  438.                 {
  439.                     Node -> Width    = 2 * Handle -> GlyphWidth * (Node -> Max - Node -> Min + 1);
  440.                     Node -> Height    = 2 * Handle -> RPort . TxHeight;
  441.                 }
  442.  
  443.                 if(Node -> Width < 20)
  444.                     Node -> Width = 20;
  445.  
  446.                 if(Node -> Chars * Handle -> GlyphWidth > Node -> Width)
  447.                     Node -> Width = Node -> Chars * Handle -> GlyphWidth;
  448.  
  449.                 if(Node -> Special . Palette . NumColours > 16)
  450.                 {
  451.                     Node -> Height    *= 2;
  452.                     Node -> Width    /= 2;
  453.                 }
  454.  
  455.                 if(Node -> Lines)
  456.                 {
  457.                     if(!Node -> Chars)
  458.                         Node -> Width = Handle -> GlyphWidth;
  459.                     else
  460.                         Node -> Width = Node -> Chars * Handle -> GlyphWidth;
  461.  
  462.                     Node -> Height    = Node -> Lines * Handle -> RPort . TxHeight;
  463.                 }
  464.  
  465.                 if(Node -> Special . Palette . ColourTable && !Node -> Special . Palette . TranslateBack)
  466.                 {
  467.                     if(Node -> Special . Palette . TranslateBack = LTP_Alloc(Handle,256))
  468.                     {
  469.                         WORD i;
  470.  
  471.                         for(i = Node -> Min ; i <= Node -> Max ; i++)
  472.                             Node -> Special . Palette . TranslateBack[Node -> Special . Palette . ColourTable[i]] = i;
  473.                     }
  474.                 }
  475.  
  476.                 break;
  477.  
  478.             case SCROLLER_KIND:
  479.  
  480.                 if(Node -> Special . Scroller . Vertical)
  481.                 {
  482.                     if(Node -> Special . Scroller . Thin)
  483.                         Node -> Width = 6 + Handle -> GlyphWidth + 6;
  484.                     else
  485.                         Node -> Width = 6 + (3 * Handle -> GlyphWidth) / 2 + 6;
  486.  
  487.                     Node -> Height = 2 + Node -> Lines * Handle -> RPort . TxHeight;
  488.  
  489.                     if(Node -> Special . Scroller . Arrows)
  490.                     {
  491.                         WORD ScrollerHeight = (Handle -> AspectX * Node -> Width) / Handle -> AspectY;
  492.  
  493.                         if(Node -> Height < 2 + Node -> Lines * Handle -> RPort . TxHeight + 2 * ScrollerHeight)
  494.                             Node -> Height = 2 + Node -> Lines * Handle -> RPort . TxHeight + 2 * ScrollerHeight;
  495.  
  496.                         Node -> Special . Scroller . ArrowSize = ScrollerHeight;
  497.                     }
  498.                 }
  499.                 else
  500.                 {
  501.                     Node -> Width  = 6 + Node -> Chars * Handle -> GlyphWidth + 6;
  502.                     Node -> Height = 2 + Handle -> RPort . TxHeight;
  503.  
  504.                     if(Node -> Special . Scroller . Arrows)
  505.                     {
  506.                         WORD ScrollerWidth = (Handle -> AspectY * Node -> Height) / Handle -> AspectX;
  507.  
  508.                         if(Node -> Width < 6 + Handle -> GlyphWidth + 2 * ScrollerWidth + 6)
  509.                             Node -> Width = 6 + Handle -> GlyphWidth + 2 * ScrollerWidth + 6;
  510.  
  511.                         Node -> Special . Scroller . ArrowSize = ScrollerWidth;
  512.                     }
  513.                 }
  514.  
  515.                 if(Node -> LabelWidth > Node -> Width && (Node -> LabelPlace == PLACE_ABOVE || Node -> LabelPlace == PLACE_BELOW))
  516.                     Node -> Width = Node -> LabelWidth;
  517.  
  518.                 break;
  519.  
  520.             case SLIDER_KIND:
  521.             {
  522.                 BOOLEAN CheckIt;
  523.  
  524.                 Node -> Width    = 6 + Node -> Chars * Handle -> GlyphWidth + 6;
  525.                 Node -> Height    = 2 + Handle -> RPort . TxHeight + 1;
  526.  
  527.                 CheckIt = (!Node -> Special . Slider . MaxLevelLen || !Node -> Special . Slider . LevelWidth || Handle -> Rescaled);
  528.  
  529.                 if(CheckIt)
  530.                     LT_LevelWidth(Handle,Node -> Special . Slider . LevelFormat,Node -> Special . Slider . DispFunc,Node -> Min,Node -> Max,&Node -> Special . Slider . LevelWidth,&Node -> Special . Slider . MaxLevelLen,Node -> Special . Slider . FullLevelCheck);
  531.  
  532.                 if(!V40)
  533.                 {
  534.                     if(Node -> Special . Slider . MaxLevelLen * Handle -> RPort . TxWidth < Node -> Special . Slider . LevelWidth)
  535.                         Node -> Special . Slider . MaxLevelLen = (Node -> Special . Slider . LevelWidth + Handle -> RPort . TxWidth - 1) / Handle -> RPort . TxWidth;
  536.                 }
  537.  
  538.                 if(Node -> Special . Slider . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace == PLACE_LEFT && Node -> Label && CheckIt)
  539.                 {
  540.                     LONG    space,len;
  541.                     STRPTR    Buffer;
  542.  
  543.                     space = TextLength(&Handle -> RPort," ",1);
  544.                     space = (Node -> Special . Slider . LevelWidth + space - 1) / space;
  545.  
  546.                     if(!V40 && (Handle -> RPort . TxFlags & FPF_PROPORTIONAL))
  547.                     {
  548.                         Node -> Special . Slider . MaxLevelLen++;
  549.  
  550.                         space++;
  551.                     }
  552.  
  553.                     if(Node -> Special . Slider . OriginalLabel)
  554.                         LTP_Free(Handle,Node -> Label,strlen(Node -> Label) + 1);
  555.                     else
  556.                         Node -> Special . Slider . OriginalLabel = Node -> Label;
  557.  
  558.                     len = strlen(Node -> Special . Slider . OriginalLabel);
  559.  
  560.                     if(Buffer = LTP_Alloc(Handle,len + space + 1))
  561.                     {
  562.                         strcpy(Buffer,Node -> Special . Slider . OriginalLabel);
  563.  
  564.                         while(space > 0)
  565.                         {
  566.                             Buffer[len] = ' ';
  567.                             len++;
  568.                             space--;
  569.                         }
  570.  
  571.                         Buffer[len] = 0;
  572.  
  573.                         Node -> Label        = Buffer;
  574.                         Node -> LabelWidth    = LT_LabelWidth(Handle,Node -> Label);
  575.                     }
  576.                     else
  577.                         break;
  578.                 }
  579.  
  580.                 if(Node -> LabelChars * Handle -> GlyphWidth > Node -> LabelWidth)
  581.                     Node -> LabelWidth = Node -> LabelChars * Handle -> GlyphWidth;
  582.  
  583.                 if(Node -> LabelWidth > Node -> Width && (Node -> LabelPlace == PLACE_ABOVE || Node -> LabelPlace == PLACE_BELOW))
  584.                     Node -> Width = Node -> LabelWidth;
  585.  
  586.                 break;
  587.             }
  588.  
  589.             case STRING_KIND:
  590.  
  591.                 Node -> Width    = 6 + Node -> Chars * Handle -> GlyphWidth + 6;
  592.                 Node -> Height    = 3 + Handle -> RPort . TxHeight + 3;
  593.  
  594.                 if(Node -> Special . String . UsePicker)
  595.                     Node -> Width += (4 + (Handle -> GlyphWidth & ~1) + 1 + 4);
  596.  
  597.                 if(Node -> LabelWidth > Node -> Width && (Node -> LabelPlace == PLACE_ABOVE || Node -> LabelPlace == PLACE_BELOW))
  598.                     Node -> Width = Node -> LabelWidth;
  599.  
  600.                 break;
  601.  
  602.             case INTEGER_KIND:
  603.  
  604.                 Node -> Width    = 6 + Node -> Chars * Handle -> GlyphWidth + 6;
  605.                 Node -> Height    = 3 + Handle -> RPort . TxHeight + 3;
  606.  
  607.                 if(Node -> Special . Integer . UseIncrementers)
  608.                 {
  609.                     Node -> Width += 4 + Handle -> GlyphWidth + 4;
  610.                     Node -> Width += 4 + Handle -> GlyphWidth + 4;
  611.                 }
  612.  
  613.                 if(Node -> LabelWidth > Node -> Width && (Node -> LabelPlace == PLACE_ABOVE || Node -> LabelPlace == PLACE_BELOW))
  614.                     Node -> Width = Node -> LabelWidth;
  615.  
  616.                 break;
  617.  
  618.             case PASSWORD_KIND:
  619.             case FRACTION_KIND:
  620.  
  621.                 Node -> Width    = 6 + Node -> Chars * Handle -> GlyphWidth + 6;
  622.                 Node -> Height    = 3 + Handle -> RPort . TxHeight + 3;
  623.  
  624.                 if(Node -> LabelWidth > Node -> Width && (Node -> LabelPlace == PLACE_ABOVE || Node -> LabelPlace == PLACE_BELOW))
  625.                     Node -> Width = Node -> LabelWidth;
  626.  
  627.                 break;
  628.         }
  629.     }
  630. }
  631.